home *** CD-ROM | disk | FTP | other *** search
- IDT 'PFA'
- *
- * Prime-Factor FFT Program
- *
- * Complex input data.
- * Table lookup of coefficients.
- * No scaling is done on intermediate values in the program.
- * External data RAM is addressed via peripheral I/O instructions.
- * An address counter is required and is loaded by a write
- * to port 0. Data is read from and written to port 1.
- * Final results are output in unscrambled order to port 2.
- * Data in the external RAM assumes complex data with corresponding
- * real and imaginary data values in consecutive locations.
- *
- * N is the size of the transform (N = NI1*NI2*...NIm).
- N EQU 63
- NI1 EQU 7
- NI2 EQU 9
- *
- * Data Memory Allocation.
- *
- X1 EQU 0 *** Current data points
- Y1 EQU 1 *
- X2 EQU 2 *
- Y2 EQU 3 *
- X3 EQU 4 *
- Y3 EQU 5 *
- X4 EQU 6 *
- Y4 EQU 7 *
- X5 EQU 8 *
- Y5 EQU 9 *
- X6 EQU 10 *
- Y6 EQU 11 *
- X7 EQU 12 *
- Y7 EQU 13 *
- X8 EQU 14 *
- Y8 EQU 15 *
- X9 EQU 16 *
- Y9 EQU 17 ***
- I1 EQU 18 *** External data addresses
- I2 EQU 19 *
- I3 EQU 20 *
- I4 EQU 21 *
- I5 EQU 22 *
- I6 EQU 23 *
- I7 EQU 24 *
- I8 EQU 25 *
- I9 EQU 26 ***
- R1 EQU 27 *** Temporary locations
- R2 EQU 28 *
- R3 EQU 29 *
- R4 EQU 30 *
- R5 EQU 31 *
- R6 EQU 32 *
- R7 EQU 33 *
- R8 EQU 34 *
- R9 EQU 35 *
- R10 EQU 36 *
- S1 EQU 37 *
- S2 EQU 38 *
- S3 EQU 39 *
- S4 EQU 40 *
- S5 EQU 41 *
- S6 EQU 42 *
- S7 EQU 43 *
- S8 EQU 44 *
- S9 EQU 45 *
- S10 EQU 46 *
- T EQU 47 *
- T1 EQU 48 *
- T2 EQU 49 *
- T3 EQU 50 *
- T4 EQU 51 *
- U EQU 52 *
- U1 EQU 53 *
- U2 EQU 54 *
- U3 EQU 55 *
- U4 EQU 56 ***
- C72 EQU 57 *** Locations of coefficients
- C73 EQU 58 *
- C74 EQU 59 *
- C71 EQU 60 *
- C75 EQU 61 *
- C76 EQU 62 *
- C77 EQU 63 *
- C78 EQU 64 *
- C31 EQU 65 *
- C32 EQU 66 *
- C94 EQU 67 *
- C92 EQU 68 *
- C93 EQU 69 *
- C98 EQU 70 *
- C96 EQU 71 *
- C97 EQU 72 ***
- ONE EQU 73 * Contains value 1
- N1A EQU 74 * N1 for the first module
- N2A EQU 75 * N2 for the first module
- N1B EQU 76 * N1 for the second module
- N2B EQU 77 * N2 for the second module
- J EQU 78 *
- HOLDN EQU 79 * Contains value N
- UNSC EQU 80 * Location of unscrambling constant
- *
- * Start of program memory section.
- *
- AORG 0
- START LDPK 0
- LACK 1
- SACL ONE * ONE = 1
- MPYK N
- PAC
- SACL HOLDN * HOLDN = N
- MPYK CTABLE
- PAC * ACC has address of coefficient table
- LARK AR0,C72
- LARK AR1,15
- RDCOEF LARP 0 * Read coefficients into data memory
- TBLR *+,AR1
- ADD ONE
- BANZ RDCOEF
- LACK 16
- SACL UNSC * Unscrambling factor = 16 for N = 63
- LACK NI1 * Initialize N1 and N2 for all modules
- SACL N1A
- SACL N2B
- LACK NI2
- SACL N2A
- SACL N1B
- ZAC
- SACL J * J = 0
- *
- * Module 1, WFTA = 7.
- *
- JLOOP1 LARK AR0,I1
- LARP 0 * AR0 points to address locations
- LAC J,1
- SACL *+ * I1 = J (data organized as real value followed
- * * by imaginary so address I1 is 2 times J).
- LARK AR1,NI1-2
- LLOOP1 LARP 0
- ADD N2A,1
- SUB HOLDN,1
- BGEZ MOD1
- ADD HOLDN,1
- MOD1 SACL *+,0,AR1 * I(L) = (I + N2)mod N
- BANZ LLOOP1 * Loop for L = 2 to N1
- *
- CALL WFTA7 * Call WFTA module
- LAC J
- ADD N1A
- SACL J * J = J + N1
- SUB HOLDN
- BLZ JLOOP1 * Loop while J <= N
- *
- * Module 2, WFTA = 9.
- *
- ZAC
- SACL J * J = 0
- JLOOP2 LARK AR0,I1 * AR0 points to address locations
- LARP 0
- LAC J,1
- SACL *+ * I1 = J
- LARK AR1,NI2-2
- LLOOP2 LARP 0
- ADD N2B,1
- SUB HOLDN,1
- BGEZ MOD2
- ADD HOLDN,1
- MOD2 SACL *+,0,AR1 * I(L) = (I + N1)mod N
- BANZ LLOOP2 * Loop for L = 2 to N1
- *
- CALL WFTA9 * Call WFTA module
- LAC J
- ADD N1B
- SACL J * J = J + N1
- SUB HOLDN
- BLZ JLOOP2 * Loop while J <= N
- *
- * Unscrambler.
- *
- LARK AR0,62
- LARP 0
- ZAC
- SACL J
- UNSCRA OUT J,PA0 * Read in data from address J
- IN X1,PA1
- IN Y1,PA1
- OUT X1,PA2 * Output unscrambled data to port 2
- OUT Y1,PA2
- LAC J
- ADD UNSC,1
- SUB HOLDN,1
- BGEZ UNS1
- ADD HOLDN,1
- UNS1 SACL J * J = (J + UNSC)mod N
- BANZ UNSCRA * Loop over all data points
- *
- * PFA complete.
- *
- STOP B STOP
- *********************************************************************
- *
- * WFTA modules.
- *
- *********************************************************************
- *
- * Length-7 module.
- *
- WFTA7 OUT I1,PA0 * Input 7 data points
- IN X1,PA1
- IN Y1,PA1
- OUT I2,PA0
- IN X2,PA1
- IN Y2,PA1
- OUT I3,PA0
- IN X3,PA1
- IN Y3,PA1
- OUT I4,PA0
- IN X4,PA1
- IN Y4,PA1
- OUT I5,PA0
- IN X5,PA1
- IN Y5,PA1
- OUT I6,PA0
- IN X6,PA1
- IN Y6,PA1
- OUT I7,PA0
- IN X7,PA1
- IN Y7,PA1
- *
- * Main length-7 calculations.
- *
- PFA7 LAC X2
- ADD X7
- SACL R1 * R1 = X2 + X7
- SUB X7,1
- SACL R2 * R2 = X2 - X7
- LAC Y2
- ADD Y7
- SACL S1 * S1 = Y2 + Y7
- SUB Y7,1
- SACL S2 * S2 = Y2 - Y7
- LAC X3
- ADD X6
- SACL R3 * R3 = X3 + X6
- SUB X6,1
- SACL R4 * R4 = X3 - X6
- LAC Y3
- ADD Y6
- SACL S3 * S3 = Y3 + Y6
- SUB Y6,1
- SACL S4 * S4 = Y3 - Y6
- LAC X4
- ADD X5
- SACL R5 * R5 = X4 + X5
- SUB X5,1
- SACL R6 * R6 = X4 - X5
- LAC Y4
- ADD Y5
- SACL S5 * S5 = Y4 + Y5
- SUB Y5,1
- SACL S6 * S6 = Y4 - Y5
- LAC R1
- ADD R3
- ADD R5
- SACL T1 * T1 = R1 + R3 + R5
- LAC S1
- ADD S3
- ADD S5
- SACL U1 * U1 = S1 + S3 + S5
- LAC X1
- ADD T1
- SACL X1 * X1 = X1 + T1
- LAC Y1
- ADD U1
- SACL Y1 * Y1 = Y1 + U1
- *
- LT C71 * (+ -1.0)
- MPY T1
- PAC
- ADD X1,15
- SUB T1,15
- SACH T1,1 * T1 = X1 + C71 * T1
- MPY U1
- PAC
- ADD Y1,15
- SUB U1,15
- SACH U1,1 * U1 = Y1 + C71 * U1
- LT C72
- MPY R1
- PAC
- MPY R5
- SPAC
- SACH T2,1 * T2 = C72 * (R1 - R5)
- MPY S1
- PAC
- MPY S5
- SPAC
- SACH U2,1 * U2 = C72 * (S1 - S5)
- LT C73
- MPY R5
- PAC
- MPY R3
- SPAC
- SACH T3,1 * T3 = C73 * (R5 - R3)
- MPY S5
- PAC
- MPY S3
- SPAC
- SACH U3,1 * U3 = C73 * (S5 - S3)
- LT C74
- MPY R3
- PAC
- MPY R1
- SPAC
- SACH T4,1 * T4 = C74 * (R3 - R1)
- MPY S3
- PAC
- MPY S1
- SPAC
- SACH U4,1 * U4 = C74 * (S3 - S1)
- LAC T1
- ADD T2
- ADD T3
- SACL R1 * R1 = T1 + T2 + T3
- LAC T1
- SUB T2
- SUB T4
- SACL R3 * R3 = T1 - T2 - T4
- LAC T1
- SUB T3
- ADD T4
- SACL R5 * R5 = T1 - T3 + T4
- LAC U1
- ADD U2
- ADD U3
- SACL S1 * S1 = U1 + U2 + U3
- LAC U1
- SUB U2
- SUB U4
- SACL S3 * S3 = U1 - U2 - U4
- LAC U1
- SUB U3
- ADD U4
- SACL S5 * S5 = U1 - U3 + U4
- LT C75
- MPY S2
- PAC
- MPY S4
- APAC
- MPY S6
- SPAC
- SACH U1,1 * U1 = C75 * (S2 + S4 - S6)
- MPY R2
- PAC
- MPY R4
- APAC
- MPY R6
- SPAC
- SACH T1,1 * T1 = C75 * (R2 + R4 - R6)
- LT C76
- MPY R2
- PAC
- MPY R6
- APAC
- SACH T2,1 * T2 = C76 * (R2 + R6)
- MPY S2
- PAC
- MPY S6
- APAC * U2 = C76 * (S2 + S6)
- SACH U2,1
- LT C77
- MPY R4
- PAC
- MPY R6
- APAC
- SACH T3,1 * T3 = C77 * (R4 + R6)
- MPY S4
- PAC
- MPY S6
- APAC
- SACH U3,1 * U3 = C77 * (S4 + S6)
- LT C78
- MPY R4
- PAC
- MPY R2
- SPAC
- SACH T4,1 * T4 = C78 * (R4 - R2)
- MPY S4
- PAC
- MPY S2
- SPAC
- SACH U4,1 * U4 = C78 * (S4 - S2)
- *
- LAC T1
- ADD T2
- ADD T3
- SACL R2 * R2 = T1 + T2 + T3
- LAC T1
- SUB T2
- SUB T4
- SACL R4 * R4 = T1 - T2 - T4
- LAC T1
- SUB T3
- ADD T4
- SACL R6 * R6 = T1 - T3 + T4
- LAC U1
- ADD U2
- ADD U3
- SACL S2 * S2 = U1 + U2 + U3
- LAC U1
- SUB U2
- SUB U4
- SACL S4 * S4 = U1 - U2 - U4
- LAC U1
- SUB U3
- ADD U4
- SACL S6 * S6 = U1 - U3 + U4
- LAC R1
- ADD S2
- SACL X2 * X2 = R1 + S2
- SUB S2,1
- SACL X7 * X7 = R1 - S2
- LAC S1
- ADD R2
- SACL Y7 * Y7 = S1 + R2
- SUB R2,1
- SACL Y2 * Y2 = S1 - R2
- LAC R3
- ADD S4
- SACL X3 * X3 = R3 + S4
- SUB S4,1
- SACL X6 * X6 = R3 - S4
- LAC S3
- ADD R4
- SACL Y6 * Y6 = S3 + R4
- SUB R4,1
- SACL Y3 * Y3 = S3 - R4
- LAC R5
- ADD S6
- SACL X5 * X5 = R5 + S6
- SUB S6,1
- SACL X4 * X4 = R5 - S6
- LAC S5
- ADD R6
- SACL Y4 * Y4 = S5 + R6
- SUB R6,1
- SACL Y5 * Y5 = S5 - R6
- *
- * Output resulting data values.
- *
- OUT I1,PA0
- OUT X1,PA1
- OUT Y1,PA1
- OUT I2,PA0
- OUT X2,PA1
- OUT Y2,PA1
- OUT I3,PA0
- OUT X3,PA1
- OUT Y3,PA1
- OUT I4,PA0
- OUT X4,PA1
- OUT Y4,PA1
- OUT I5,PA0
- OUT X5,PA1
- OUT Y5,PA1
- OUT I6,PA0
- OUT X6,PA1
- OUT Y6,PA1
- OUT I7,PA0
- OUT X7,PA1
- OUT Y7,PA1
- *
- RET * End of WFTA7
- *
- * Length-9 module.
- *
- WFTA9 OUT I1,PA0 * Input 9 data values
- IN X1,PA1
- IN Y1,PA1
- OUT I2,PA0
- IN X2,PA1
- IN Y2,PA1
- OUT I3,PA0
- IN X3,PA1
- IN Y3,PA1
- OUT I4,PA0
- IN X4,PA1
- IN Y4,PA1
- OUT I5,PA0
- IN X5,PA1
- IN Y5,PA1
- OUT I6,PA0
- IN X6,PA1
- IN Y6,PA1
- OUT I7,PA0
- IN X7,PA1
- IN Y7,PA1
- OUT I8,PA0
- IN X8,PA1
- IN Y8,PA1
- OUT I9,PA0
- IN X9,PA1
- IN Y9,PA1
- *
- * Main length-9 calculations.
- *
- PFA9 LAC X2
- ADD X9
- SACL R1 * R1 = X2 + X9
- SUB X9,1
- SACL R2 * R2 = X2 - X9
- LAC Y2
- ADD Y9
- SACL S1 * S1 = Y2 + Y9
- SUB Y9,1
- SACL S2 * S2 = Y2 - Y9
- LAC X3
- ADD X8
- SACL R3 * R3 = X3 + X8
- SUB X8,1
- SACL R4 * R4 = X3 - X8
- LAC Y3
- SUB Y8
- SACL S4 * S4 = Y3 - Y8
- ADD Y8,1
- SACL S3 * S3 = Y3 + Y8
- LAC X4
- ADD X7
- SACL R5 * R5 = X4 + X7
- *
- LT C31
- MPY X7
- PAC
- MPY X4
- SPAC
- SACH T,1 * T = -(X4 - X7) * C31
- LAC Y4
- ADD Y7
- SACL S5 * S5 = Y4 + Y7
- MPY Y7
- PAC
- MPY Y4
- SPAC
- SACH U,1 * U = -(Y4 - Y7) * C31
- *
- LAC X5
- ADD X6
- SACL R7 * R7 = X5 + X6
- SUB X6,1
- SACL R8 * R8 = X5 - X6
- LAC Y5
- ADD Y6
- SACL S7 * S7 = Y5 + Y6
- SUB Y6,1
- SACL S8 * S8 = Y5 - Y6
- LAC X1,15
- ADD R5,15
- SACH R9,1 * R9 = X1 + R5
- SUB R5,15
- LT C32
- MPY R5
- SPAC
- SACH T1,1 * T1 = X1 - R5 * C32
- LAC Y1,15
- ADD S5,15
- SACH S9,1 * S9 = Y1 + S5
- SUB S5,15
- MPY S5
- SPAC
- SACH U1,1 * U1 = Y1 - S5 * C32
- *
- LT C92
- MPY R3
- PAC
- MPY R7
- SPAC
- SACH T2,1 * T2 = (R3 - R7) * C92
- MPY S3
- PAC
- MPY S7
- SPAC
- SACH U2,1 * U2 = (S3 - S7) * C92
- LT C93
- MPY R1
- PAC
- MPY R7
- SPAC
- SACH T3,1 * T3 = (R1 - R7) * C93
- MPY S1
- PAC
- MPY S7
- SPAC
- SACH U3,1 * U3 = (S1 - S7) * C93
- LT C94
- MPY R1
- PAC
- MPY R3
- SPAC
- SACH T4,1 * T4 = (R1 - R3) * C94
- MPY S1
- PAC
- MPY S3
- SPAC
- SACH U4,1 * U4 = (S1 - S3) * C94
- *
- LAC R1
- ADD R3
- ADD R7
- SACL R10 * R10 = R1 + R3 + R7
- LAC S1
- ADD S3
- ADD S7
- SACL S10 * S10 = S1 + S3 + S7
- LAC T1
- ADD T2
- ADD T4
- SACL R1 * R1 = T1 + T2 + T4
- LAC T1
- SUB T2
- SUB T3
- SACL R3 * R3 = T1 - T2 - T3
- LAC T1
- ADD T3
- SUB T4
- SACL R7 * R7 = T1 + T3 - T4
- LAC U1
- ADD U2
- ADD U4
- SACL S1 * S1 = U1 + U2 + U4
- LAC U1
- SUB U2
- SUB U3
- SACL S3 * S3 = U1 - U2 - U3
- LAC U1
- ADD U3
- SUB U4
- SACL S7 * S7 = U1 + U3 - U4
- LAC R9,15
- ADD R10,15
- SACH X1,1 * X1 = R9 + R10
- SUB R10,15
- LT C32
- MPY R10
- SPAC
- SACH R5,1 * R5 = R9 - R10 * C32
- LAC S9,15
- ADD S10,15
- SACH Y1,1 * Y1 = S9 + S10
- SUB S10,15
- MPY S10
- SPAC
- SACH S5,1 * S5 = S9 - S10 * C32
- *
- LT C31 * C31 = 136
- MPY R4
- PAC
- MPY R2
- SPAC
- MPY R8
- SPAC
- SACH R6,1 * R6 = -(R2 - R4 + R8) * C31
- MPY S4
- PAC
- MPY S2
- SPAC
- MPY S8
- SPAC
- SACH S6,1 * S6 = -(S2 - S4 + S8) * C31
- LT C96 * C96 = 142
- MPY R4
- PAC
- MPY R8
- APAC
- SACH T2,1 * T2 = (R4 + R8) * C96
- MPY S4
- PAC
- MPY S8
- APAC
- SACH U2,1 * U2 = (S4 + S8) * C96
- LT C97
- MPY R2
- PAC
- MPY R8
- SPAC
- SACH T3,1 * T3 = (R2 - R8) * C97
- MPY S2
- PAC
- MPY S8
- SPAC
- SACH U3,1 * U3 = (S2 - S8) * C97
- LT C98 * C98 = 141
- MPY R2
- PAC
- MPY R4
- APAC
- SACH T4,1 * T4 = (R2 + R4) * C98
- MPY S2
- PAC
- MPY S4
- APAC
- SACH U4,1 * U4 = (S2 + S4) * C98
- *
- LAC T
- ADD T2
- ADD T4
- SACL R2 * R2 = T + T2 + T4
- LAC T
- SUB T2
- SUB T3
- SACL R4 * R4 = T - T2 - T3
- LAC T
- ADD T3
- SUB T4
- SACL R8 * R8 = T + T3 - T4
- LAC U
- ADD U2
- ADD U4
- SACL S2 * S2 = U + U2 + U4
- LAC U
- SUB U2
- SUB U3
- SACL S4 * S4 = U - U2 - U3
- LAC U
- ADD U3
- SUB U4
- SACL S8 * S8 = U + U3 - U4
- LAC R1
- ADD S2
- SACL X9 * X9 = R1 + S2
- SUB S2,1
- SACL X2 * X2 = R1 - S2
- LAC S1
- ADD R2
- SACL Y2 * Y2 = S1 + R2
- SUB R2,1
- SACL Y9 * Y9 = S1 - R2
- LAC R3
- ADD S4
- SACL X3 * X3 = R3 + S4
- SUB S4,1
- SACL X8 * X8 = R3 - S4
- LAC S3
- ADD R4
- SACL Y8 * Y8 = S3 + R4
- SUB R4,1
- SACL Y3 * Y3 = S3 - R4
- LAC R5
- ADD S6
- SACL X7 * X7 = R5 + S6
- SUB S6,1
- SACL X4 * X4 = R5 - S6
- LAC S5
- ADD R6
- SACL Y4 * Y4 = S5 + R6
- SUB R6,1
- SACL Y7 * Y7 = S5 - R6
- LAC R7
- ADD S8
- SACL X6 * X6 = R7 + S8
- SUB S8,1
- SACL X5 * X5 = R7 - S8
- LAC S7
- ADD R8
- SACL Y5 * Y5 = S7 + R8
- SUB R8,1
- SACL Y6 * Y6 = S7 - R8
- *
- * Output resulting data values.
- *
- OUT I1,PA0
- OUT X1,PA1
- OUT Y1,PA1
- OUT I2,PA0
- OUT X2,PA1
- OUT Y2,PA1
- OUT I3,PA0
- OUT X3,PA1
- OUT Y3,PA1
- OUT I4,PA0
- OUT X4,PA1
- OUT Y4,PA1
- OUT I5,PA0
- OUT X5,PA1
- OUT Y5,PA1
- OUT I6,PA0
- OUT X6,PA1
- OUT Y6,PA1
- OUT I7,PA0
- OUT X7,PA1
- OUT Y7,PA1
- OUT I8,PA0
- OUT X8,PA1
- OUT Y8,PA1
- OUT I9,PA0
- OUT X9,PA1
- OUT Y9,PA1
- *
- RET * End of length-9 module
- *
- ********************************************************
- *
- * Coefficient table.
- *
- ********************************************************
- CTABLE EQU $
- CFC72 DATA >6523 * C72 = 0.79015647
- CFC73 DATA >0726 * C73 = 0.055854267
- CFC74 DATA >5DFD * C74 = 0.7343022
- CFC71 DATA >EAAA * C71 = -0.1666667 (+ -1.0 IN THE PROGRAM)
- CFC75 DATA >3871 * C75 = 0.44095855
- CFC76 DATA >2BA1 * C76 = 0.34087293
- CFC77 DATA >4459 * C77 = 0.53396936
- CFC78 DATA >6FFA * C78 = 0.87484229
- *
- CFC31 DATA >6ED9 * C31 = 0.86602540
- CFC32 DATA >4000 * C32 = 0.50000000
- *
- CFC94 DATA >620D * C94 = 0.76604444
- CFC92 DATA >7847 * C92 = 0.93969262
- CFC93 DATA >E9C5 * C93 = -0.17364818
- CFC98 DATA >ADB9 * C98 = -0.64278761
- CFC96 DATA >D438 * C96 = -0.34202014
- CFC97 DATA >81F1 * C97 = -0.98480775
- *
- END